import random from otree.api import * doc = """ Treatments: A receives in-group reputation treatment; B receives out-group envy treatment. """ class C(BaseConstants): NAME_IN_URL = 'Part1' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): name = models.LongStringField() assigned_group = models.LongStringField() rank1 = models.IntegerField(label="Your first nomination for the Top 2:") rank2 = models.IntegerField(label="Your second nomination for the Top 2:") def rank1_choices(player): choices = [] for others in player.get_others_in_group(): choices.append([int(others.id_in_group), str(others.name)]) random.shuffle(choices) return choices def rank2_choices(player): choices = [] for others in player.get_others_in_group(): choices.append([int(others.id_in_group), str(others.name)]) random.shuffle(choices) return choices def creating_session(subsession): for player in subsession.get_players(): player.name = player.participant.participant_name player.assigned_group = player.participant.group_name player.participant.high_rep = 0 #Group Assigning Code rowAT = [] rowBT = [] rowAC = [] rowBC = [] for player in subsession.get_players(): if player.participant.group_name == 'A_treat': rowAT.append(player.id_in_subsession) elif player.participant.group_name == 'B_treat': rowBT.append(player.id_in_subsession) elif player.participant.group_name == 'A_cont': rowAC.append(player.id_in_subsession) elif player.participant.group_name == 'B_cont': rowBC.append(player.id_in_subsession) subsession.set_group_matrix([rowAT, rowBT, rowAC, rowBC]) # PAGES class Task2_GroupA(Page): @staticmethod def is_displayed(player): return player.participant.in_GroupA == True pass class Task2_GroupA_Ranking(Page): form_model = 'player' @staticmethod def is_displayed(player): return player.participant.in_GroupA == True def get_form_fields(player): if player.participant.in_GroupA == True: return ['rank1', 'rank2'] else: return [] def error_message(player, values): if values['rank1'] == values['rank2']: return 'You cannot nominate the same person twice.' pass class Task2_WaitPage(WaitPage): @staticmethod def is_displayed(player): return player.participant.in_GroupA == True def after_all_players_arrive(group: Group): votes = [0]*len(group.get_players()) for p in group.get_players(): votes[p.rank1 - 1] = votes[p.rank1 - 1 ]+ 1 votes[p.rank2 - 1] = votes[p.rank2 - 1] + 1 top1 = [index + 1 for index, freq in enumerate(votes) if freq == max(votes)] if len(top1) > 1: random.seed(group.subsession.session.seed_value) top_ids = random.sample(top1,2) else: top2 = [index + 1 for index, freq in enumerate(votes) if freq in sorted(votes, reverse=True)[1:2]] random.seed(group.subsession.session.seed_value) top_ids = top1 + random.sample(top2,1) for p in group.get_players(): if p.id_in_group in top_ids: p.participant.high_rep = 1 class Task2_GroupA_Results(Page): @staticmethod def is_displayed(player): return player.participant.in_GroupA == True pass class Task2_GroupB(Page): @staticmethod def is_displayed(player): return player.participant.in_GroupA == False pass page_sequence = [Task2_GroupA, Task2_GroupA_Ranking, Task2_WaitPage, Task2_GroupA_Results, Task2_GroupB]